本文共 5787 字,大约阅读时间需要 19 分钟。
项目中要实现导出文件的功能,点导出按钮时让它弹出来一个窗口,选择存储目录和文件名
实现如下:
servlet方式
弹出来的是文件下载窗口
html代码:
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>java代码:Html2PdfServlet
package com.test;import java.io.IOException;import java.io.OutputStream;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.xhtmlrenderer.pdf.ITextFontResolver;import org.xhtmlrenderer.pdf.ITextRenderer;import com.lowagie.text.pdf.BaseFont;public class Html2PdfServlet extends HttpServlet { private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //pageContext.getServletContext().getRealPath("/") ServletContext sc = request.getSession().getServletContext(); String path = sc.getRealPath(""); //值为D:\apache-tomcat-6.0.26\webapps\createpdf System.out.println("原path: " + path); //把路径中的反斜杠转成正斜杠 path = path.replaceAll("\\\\", "/"); //值为D:/apache-tomcat-6.0.26/webapps/createpdf System.out.println(path); String path2 = sc.getRealPath("/"); System.out.println("path2: " + path2); System.out.println(Thread.currentThread().getContextClassLoader().getResource("")); System.out.println("request.getRequestURI: " + request.getRequestURI()); //获取使用的端口号 System.out.println(request.getLocalPort()); String path3 = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path3+"/"; System.out.println("basepath: " + basePath); response.setContentType("application/pdf"); //response.setHeader("Content-Disposition", "attachment; filename=WebReport.pdf"); response.setHeader("Content-Disposition", "inline; filename=WebReport.pdf"); StringBuffer html = new StringBuffer(); //组装成符合W3C标准的html文件,否则不能正确解析 html.append(""); html.append("") .append("") .append(" ") .append("") .append("") .append("") .append(""); html.append("Struts1方式"); html.append(" 统计报表
"); html.append(" "); html.append(" "); html.append(""); // parse our markup into an xml Document try { ITextRenderer renderer = new ITextRenderer(); /** * 引入了新的jar包,不用再导入字体了 ITextFontResolver fontResolver = renderer.getFontResolver(); fontResolver.addFont("C:/Windows/fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); */ renderer.setDocumentFromString(html.toString()); // 解决图片的相对路径问题 //renderer.getSharedContext().setBaseURL("file:/C:/Documents and Settings/dashan.yin/workspace/createpdf/WebRoot/images"); //renderer.getSharedContext().setBaseURL("file:/D:/apache-tomcat-6.0.26/webapps/createpdf/images"); renderer.getSharedContext().setBaseURL("file:/" + path + "/images"); renderer.layout(); OutputStream os = response.getOutputStream(); renderer.createPDF(os); os.close(); } catch (Exception e) { e.printStackTrace(); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
弹出来的是另存为窗口
html代码:
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%>java代码:用户登录 用户登录
package com.bjsxt.struts;import java.io.File;import java.io.FileInputStream;import java.io.OutputStream;import java.io.PrintWriter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;import org.apache.struts.actions.DispatchAction;public class ResponseAction extends DispatchAction { /** * 要想实现另存为下载必须满足的条件: * 1.导入jar包:commons-fileupload.jar * 2.发送请求必须以一个form表单的形式,且提交的时候必须是type="submit"(这一条也不对,也以可是type="button"), * form的action值为相应的Action,后面不能跟方法名,跟一个form属性method="post",即: *3.相应的Action中方法名为execute,即:(这一条不对,这跟struts配置有关) public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) * * 现在最新总结出来:只需要满足两个条件: * 导入jar包:commons-fileupload.jar * 以表单提交 * */ public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { StringBuffer buffer = new StringBuffer("你好"); String pdfPathName = "C:/Documents and Settings/dashan.yin/workspace/webmonitor_4/WebRoot/pdf/test.pdf"; try { OutputStream out = response.getOutputStream(); byte by[] = new byte[1024]; File fileLoad = new File(pdfPathName); response.reset(); response.setContentType("application/pdf"); response.setHeader("Content-Disposition", "attachment; filename=WebReport.pdf"); long fileLength = fileLoad.length(); String length1 = String.valueOf(fileLength); response.setHeader("Content_Length", length1); FileInputStream in = new FileInputStream(fileLoad); int n; while ((n = in.read(by)) != -1) { out.write(by, 0, n); } in.close(); out.flush(); } catch (Exception e) { e.printStackTrace(); } return null; }}
转载地址:http://cltci.baihongyu.com/